অ্যাডভান্সড সকেট প্রোগ্রামিং হল নেটওয়ার্ক প্রোগ্রামিংয়ের একটি উন্নত দিক, যেখানে সিস্টেমের কার্যকারিতা, স্কেলেবিলিটি এবং সিকিউরিটি নিশ্চিত করতে আরও জটিল এবং উন্নত কৌশল ব্যবহার করা হয়। এটি বিশেষভাবে ইন্টার-প্রসেস কমিউনিকেশন, একাধিক ক্লায়েন্ট সমর্থন, থ্রেডিং, নন-ব্লকিং I/O এবং সিকিউরড যোগাযোগের জন্য ব্যবহৃত হয়।
এখানে কিছু অ্যাডভান্সড সকেট প্রোগ্রামিংয়ের উদাহরণ এবং প্রয়োগ নিয়ে আলোচনা করা হবে।
নন-ব্লকিং সকেট ব্যবহার করে একটি সকেটকে এমনভাবে কনফিগার করা যায় যে এটি কোনো ডেটা পাঠানোর জন্য অপেক্ষা করবে না, বরং অবিলম্বে কাজ করতে যাবে। এটি সাধারণত একাধিক ক্লায়েন্টের সাথে একই সময়ে যোগাযোগ করার জন্য ব্যবহৃত হয়।
import socket
import select
# সার্ভার সেটআপ
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.setblocking(False) # নন-ব্লকিং সকেট
server_socket.bind(('127.0.0.1', 65432))
server_socket.listen(5)
# সিলেক্ট ফাংশন ব্যবহার করে নেটওয়ার্ক আই/ও অপারেশন
inputs = [server_socket]
while True:
readable, _, _ = select.select(inputs, [], [])
for s in readable:
if s is server_socket:
client_socket, client_address = s.accept()
print(f"Client connected: {client_address}")
client_socket.setblocking(False)
inputs.append(client_socket)
else:
data = s.recv(1024)
if data:
print(f"Received data: {data.decode()}")
else:
print(f"Client disconnected")
inputs.remove(s)
s.close()
এখানে, সার্ভার নন-ব্লকিং মোডে থাকে, তাই এটি একটি ক্লায়েন্টের সাথে সংযোগ করার জন্য ব্লক হবে না। select.select()
ব্যবহার করে সার্ভার একাধিক ক্লায়েন্ট থেকে আসা ডেটা একযোগে গ্রহণ করতে পারে।
একটি থ্রেডেড সার্ভার একাধিক ক্লায়েন্টের সাথে একযোগে যোগাযোগ করতে সক্ষম, যেখানে প্রতিটি ক্লায়েন্টের জন্য আলাদা থ্রেড তৈরি করা হয়। এটি কার্যকারিতা বাড়ানোর জন্য ব্যবহৃত হয়, বিশেষত যখন অনেক ক্লায়েন্ট একসাথে সার্ভারে সংযোগ করে।
import socket
import threading
def handle_client(client_socket):
with client_socket:
print("Client connected")
while True:
data = client_socket.recv(1024)
if not data:
break
print(f"Received data: {data.decode()}")
client_socket.sendall(data)
print("Client disconnected")
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('127.0.0.1', 65432))
server_socket.listen(5)
print("Server listening on port 65432")
while True:
client_socket, client_address = server_socket.accept()
print(f"Connection from {client_address}")
client_thread = threading.Thread(target=handle_client, args=(client_socket,))
client_thread.start()
এখানে, প্রতি ক্লায়েন্টের জন্য একটি নতুন থ্রেড তৈরি করা হয়, যা ক্লায়েন্টের সাথে আলাদা করে যোগাযোগ স্থাপন করে।
আসিঙ্ক্রোনাস সকেট প্রোগ্রামিং একটি শক্তিশালী পদ্ধতি যা নেটওয়ার্ক অপারেশনগুলিকে ব্যাকগ্রাউন্ডে সম্পন্ন করতে সাহায্য করে। এর ফলে মূল থ্রেড ব্লক না হয়ে অন্যান্য কাজ করতে পারে।
import asyncio
async def handle_client(reader, writer):
data = await reader.read(100)
message = data.decode()
addr = writer.get_extra_info('peername')
print(f"Received {message} from {addr}")
response = f"Hello, {message}"
writer.write(response.encode())
await writer.drain()
print("Closing the connection")
writer.close()
async def main():
server = await asyncio.start_server(
handle_client, '127.0.0.1', 65432)
addr = server.sockets[0].getsockname()
print(f"Serving on {addr}")
async with server:
await server.serve_forever()
asyncio.run(main())
এখানে, asyncio
লাইব্রেরি ব্যবহার করা হয়েছে যাতে মূল থ্রেড ব্লক না হয়। যখন একটি ক্লায়েন্ট সংযোগ করে, তখন handle_client()
আসিঙ্ক্রোনাসভাবে কাজ করে এবং সার্ভারটি অন্যান্য ক্লায়েন্টদের জন্য উন্মুক্ত থাকে।
এটি নিরাপত্তা নিশ্চিত করার জন্য ব্যবহৃত হয়, যেখানে সার্ভার এবং ক্লায়েন্টের মধ্যে আদান-প্রদান করা ডেটা এনক্রিপ্ট করা থাকে। SSL/TLS প্রোটোকলগুলি সুরক্ষিত সংযোগ প্রতিষ্ঠা করতে সাহায্য করে।
import socket
import ssl
# সার্ভার সেটআপ
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('127.0.0.1', 65432))
server_socket.listen(5)
# SSL সুরক্ষিত সকেট তৈরি করা
ssl_socket = ssl.wrap_socket(server_socket, keyfile="server.key", certfile="server.crt", server_side=True)
print("Server listening on port 65432")
while True:
client_socket, client_address = ssl_socket.accept()
print(f"Connection from {client_address}")
data = client_socket.recv(1024)
print(f"Received: {data.decode()}")
client_socket.sendall(b"Hello, secure world!")
client_socket.close()
এখানে, ssl.wrap_socket()
ব্যবহার করা হয়েছে যাতে সার্ভারের সকেট SSL/TLS এনক্রিপশনে রূপান্তরিত হয়, এবং ক্লায়েন্টের সাথে নিরাপদভাবে ডেটা আদান-প্রদান করা যায়।
মাল্টিকাস্ট সকেট একযোগে একাধিক ক্লায়েন্টের কাছে ডেটা পাঠানোর জন্য ব্যবহৃত হয়। এটি বিশেষভাবে স্ট্রিমিং সার্ভিস বা ডেটা বিতরণের জন্য উপকারী।
import socket
import struct
multicast_group = ('224.1.1.1', 10000)
# সকেট সেটআপ
server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# মাল্টিকাস্ট সকেট কনফিগার করা
server_socket.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 255)
# বার্তা পাঠানো
message = b"This is a multicast message!"
server_socket.sendto(message, multicast_group)
এখানে, একটি মাল্টিকাস্ট গন্তব্য (224.1.1.1) সেট করা হয়েছে এবং সেই ঠিকানায় বার্তা পাঠানো হচ্ছে।
অ্যাডভান্সড সকেট প্রোগ্রামিংয়ের মাধ্যমে, উন্নত প্রযুক্তি যেমন নন-ব্লকিং I/O, থ্রেডিং, আসিঙ্ক্রোনাস I/O, SSL/TLS এনক্রিপশন, এবং মাল্টিকাস্ট সোসকেটের ব্যবহার সম্ভব। এই প্রোগ্রামিং কৌশলগুলি একাধিক ক্লায়েন্ট, নিরাপদ সংযোগ, এবং উচ্চ কার্যকারিতার জন্য প্রয়োজনীয়।
common.read_more